package org.alex.nettychat.javaIO;

import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 传统IO的服务端实现
 * @author : alex
 */
public class IOServer {

    /**
     * 问题：
     * 1.线程资源受限：线程是操作系统中非常宝贵的资源，同一时刻有大量的线程处于阻塞状态，是非常严重的资源浪费，操作系统耗不起。
     * 2.线程切换效率低下：单机CPU核数固定，线程爆炸之后操作系统频繁进行线程切换，应用性能急剧下降。
     * 3.除了以上两个问题，在IO编程中，我们看到数据读写是以字节流为单位的。
     */

    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(8000);

        // 接受新线程
        new Thread(()->{
            try {
                while (true) {
                    // 1 阻塞方法获取新连接
                    Socket socket = serverSocket.accept();

                    // 2 为每一个新连接创建一个线程 读取数据
                    new Thread(()->{
                        try {
                            int len;
                            byte[] data = new byte[1024];
                            InputStream inputStream = socket.getInputStream();
                            // 3 按字节流方式读取数据
                            while ((len = inputStream.read(data)) != -1) {
                                System.out.println(new String(data, 0, len));
                            }
                        } catch (Exception e) {

                        }

                    }).start();
                }
            } catch (Exception e) {

            }
        }).start();
    }
}
